package uy.edu.ort.dominio;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

/**
 *
 * @author 153287 - 154559
 */
@Entity
@NamedQueries({
    @NamedQuery(name="Programa.findAll",
                query="SELECT p FROM Programa p"),
    @NamedQuery(name="Programa.findByNombre",
                query="SELECT p FROM Programa p WHERE p.nombre = :NOMBRE"),
}) 
public class Programa extends EntidadPersistente implements Serializable {
    
    /**
     * Cliente que solicita el programa.
     */
    @ManyToOne
    @JoinColumn(name="ID_CLIENTE", referencedColumnName="ID_CLIENTE")
    private Cliente cliente;
    
    /**
     * Nombre del programa.
     */
    @Column(name="NOMBRE", unique=true)
    private String nombre;
    
    /**
     * Lista de páginas del programa.
     */
    @OneToMany(mappedBy="programa", fetch = FetchType.LAZY)
    @Cascade(CascadeType.ALL)
    private List<Pagina> paginas;

    /**
     * Tamaño del programa.
     */
    @Column(name="TAMAÑO")
    private long tamaño;
    
    /**
     * Cantidad de páginas del programa.
     */
    @Column(name="CANTIDAD_PAGINAS")
    private long cantidadPaginas;
    
    /**
     * Constructor, inicializa la lisa de paginas.
     */
    public Programa() {
        this.paginas = new ArrayList<>();
    }
    
    /**
     * Retorna el cliente que solicitó el programa.
     * @return Cliente
     */
    public Cliente getCliente() {
        return cliente;
    }

    /**
     * Asigna el cliente que solicita el programa.
     * @param cliente 
     */
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    /**
     * Retorna el nombre del programa.
     * @return String
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * Asigna un nombre al programa.
     * @param nombre 
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * Retorna la lista de páginas del programa.
     * @return List<Pagina>
     */
    public List<Pagina> getPaginas() {
        return paginas;
    }

    /**
     * Asigna una lista de pagínas al programa.
     * @param paginas 
     */
    public void setPaginas(List<Pagina> paginas) {
        this.paginas = paginas;
    }

        
    /**
     * Retorna el tamaño de todas las páginas del programa en bytes.
     * @return long tamaño en bytes
     */
    public long getTamaño() {
        return tamaño;
    }

    /**
     * Setea el tamaño de todas las páginas del programa en bytes.
     */
    public void setTamaño(long tamaño) {
        this.tamaño = tamaño;
    }

    /**
     * Retorna la cantidad páginas del programa.
     * @return long
     */
    public long getCantidadPaginas() {
        return cantidadPaginas;
    }

    /**
     * Setea la cantidad páginas del programa.
     */
    public void setCantidadPaginas(long cantidadPaginas) {
        this.cantidadPaginas = cantidadPaginas;
    }
    
    /**
     * Retorna un String con los datos completos del programa.
     */       
    @Override
    public String toString() {
        return this.nombre;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (obj == null || obj.getClass() != this.getClass()) {
            return false;
        }
        Programa p = (Programa) obj;
        
        return this.nombre.equals(p.getNombre());
    }    

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 89 * hash + Objects.hashCode(this.nombre);
        return hash;
    }
}
